home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / lib / python2.5 / distutils / dist.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-29  |  38KB  |  1,073 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. '''distutils.dist
  5.  
  6. Provides the Distribution class, which represents the module distribution
  7. being built/installed/distributed.
  8. '''
  9. __revision__ = '$Id: dist.py 38697 2005-03-23 18:54:36Z loewis $'
  10. import sys
  11. import os
  12. import string
  13. import re
  14. from types import *
  15. from copy import copy
  16.  
  17. try:
  18.     import warnings
  19. except ImportError:
  20.     warnings = None
  21.  
  22. from distutils.errors import *
  23. from distutils.fancy_getopt import FancyGetopt, translate_longopt
  24. from distutils.util import check_environ, strtobool, rfc822_escape
  25. from distutils import log
  26. from distutils.debug import DEBUG
  27. command_re = re.compile('^[a-zA-Z]([a-zA-Z0-9_]*)$')
  28.  
  29. class Distribution:
  30.     """The core of the Distutils.  Most of the work hiding behind 'setup'
  31.     is really done within a Distribution instance, which farms the work out
  32.     to the Distutils commands specified on the command line.
  33.  
  34.     Setup scripts will almost never instantiate Distribution directly,
  35.     unless the 'setup()' function is totally inadequate to their needs.
  36.     However, it is conceivable that a setup script might wish to subclass
  37.     Distribution for some specialized purpose, and then pass the subclass
  38.     to 'setup()' as the 'distclass' keyword argument.  If so, it is
  39.     necessary to respect the expectations that 'setup' has of Distribution.
  40.     See the code for 'setup()', in core.py, for details.
  41.     """
  42.     global_options = [
  43.         ('verbose', 'v', 'run verbosely (default)', 1),
  44.         ('quiet', 'q', 'run quietly (turns verbosity off)'),
  45.         ('dry-run', 'n', "don't actually do anything"),
  46.         ('help', 'h', 'show detailed help message')]
  47.     common_usage = "Common commands: (see '--help-commands' for more)\n\n  setup.py build      will build the package underneath 'build/'\n  setup.py install    will install the package\n"
  48.     display_options = [
  49.         ('help-commands', None, 'list all available commands'),
  50.         ('name', None, 'print package name'),
  51.         ('version', 'V', 'print package version'),
  52.         ('fullname', None, 'print <package name>-<version>'),
  53.         ('author', None, "print the author's name"),
  54.         ('author-email', None, "print the author's email address"),
  55.         ('maintainer', None, "print the maintainer's name"),
  56.         ('maintainer-email', None, "print the maintainer's email address"),
  57.         ('contact', None, "print the maintainer's name if known, else the author's"),
  58.         ('contact-email', None, "print the maintainer's email address if known, else the author's"),
  59.         ('url', None, 'print the URL for this package'),
  60.         ('license', None, 'print the license of the package'),
  61.         ('licence', None, 'alias for --license'),
  62.         ('description', None, 'print the package description'),
  63.         ('long-description', None, 'print the long package description'),
  64.         ('platforms', None, 'print the list of platforms'),
  65.         ('classifiers', None, 'print the list of classifiers'),
  66.         ('keywords', None, 'print the list of keywords'),
  67.         ('provides', None, 'print the list of packages/modules provided'),
  68.         ('requires', None, 'print the list of packages/modules required'),
  69.         ('obsoletes', None, 'print the list of packages/modules made obsolete')]
  70.     display_option_names = map((lambda x: translate_longopt(x[0])), display_options)
  71.     negative_opt = {
  72.         'quiet': 'verbose' }
  73.     
  74.     def __init__(self, attrs = None):
  75.         '''Construct a new Distribution instance: initialize all the
  76.         attributes of a Distribution, and then use \'attrs\' (a dictionary
  77.         mapping attribute names to values) to assign some of those
  78.         attributes their "real" values.  (Any attributes not mentioned in
  79.         \'attrs\' will be assigned to some null value: 0, None, an empty list
  80.         or dictionary, etc.)  Most importantly, initialize the
  81.         \'command_obj\' attribute to the empty dictionary; this will be
  82.         filled in with real command objects by \'parse_command_line()\'.
  83.         '''
  84.         self.verbose = 1
  85.         self.dry_run = 0
  86.         self.help = 0
  87.         for attr in self.display_option_names:
  88.             setattr(self, attr, 0)
  89.         
  90.         self.metadata = DistributionMetadata()
  91.         for basename in self.metadata._METHOD_BASENAMES:
  92.             method_name = 'get_' + basename
  93.             setattr(self, method_name, getattr(self.metadata, method_name))
  94.         
  95.         self.cmdclass = { }
  96.         self.command_packages = None
  97.         self.script_name = None
  98.         self.script_args = None
  99.         self.command_options = { }
  100.         self.dist_files = []
  101.         self.packages = None
  102.         self.package_data = { }
  103.         self.package_dir = None
  104.         self.py_modules = None
  105.         self.libraries = None
  106.         self.headers = None
  107.         self.ext_modules = None
  108.         self.ext_package = None
  109.         self.include_dirs = None
  110.         self.extra_path = None
  111.         self.scripts = None
  112.         self.data_files = None
  113.         self.command_obj = { }
  114.         self.have_run = { }
  115.         if attrs:
  116.             options = attrs.get('options')
  117.             if options:
  118.                 del attrs['options']
  119.                 for command, cmd_options in options.items():
  120.                     opt_dict = self.get_option_dict(command)
  121.                     for opt, val in cmd_options.items():
  122.                         opt_dict[opt] = ('setup script', val)
  123.                     
  124.                 
  125.             
  126.             if attrs.has_key('licence'):
  127.                 attrs['license'] = attrs['licence']
  128.                 del attrs['licence']
  129.                 msg = "'licence' distribution option is deprecated; use 'license'"
  130.                 if warnings is not None:
  131.                     warnings.warn(msg)
  132.                 else:
  133.                     sys.stderr.write(msg + '\n')
  134.             
  135.             for key, val in attrs.items():
  136.                 if hasattr(self.metadata, 'set_' + key):
  137.                     getattr(self.metadata, 'set_' + key)(val)
  138.                     continue
  139.                 if hasattr(self.metadata, key):
  140.                     setattr(self.metadata, key, val)
  141.                     continue
  142.                 if hasattr(self, key):
  143.                     setattr(self, key, val)
  144.                     continue
  145.                 msg = 'Unknown distribution option: %s' % repr(key)
  146.                 if warnings is not None:
  147.                     warnings.warn(msg)
  148.                     continue
  149.                 sys.stderr.write(msg + '\n')
  150.             
  151.         
  152.         self.finalize_options()
  153.  
  154.     
  155.     def get_option_dict(self, command):
  156.         """Get the option dictionary for a given command.  If that
  157.         command's option dictionary hasn't been created yet, then create it
  158.         and return the new dictionary; otherwise, return the existing
  159.         option dictionary.
  160.         """
  161.         dict = self.command_options.get(command)
  162.         if dict is None:
  163.             dict = self.command_options[command] = { }
  164.         
  165.         return dict
  166.  
  167.     
  168.     def dump_option_dicts(self, header = None, commands = None, indent = ''):
  169.         pformat = pformat
  170.         import pprint
  171.         if commands is None:
  172.             commands = self.command_options.keys()
  173.             commands.sort()
  174.         
  175.         if header is not None:
  176.             print indent + header
  177.             indent = indent + '  '
  178.         
  179.         if not commands:
  180.             print indent + 'no commands known yet'
  181.             return None
  182.         
  183.         for cmd_name in commands:
  184.             opt_dict = self.command_options.get(cmd_name)
  185.             if opt_dict is None:
  186.                 print indent + "no option dict for '%s' command" % cmd_name
  187.                 continue
  188.             print indent + "option dict for '%s' command:" % cmd_name
  189.             out = pformat(opt_dict)
  190.             for line in string.split(out, '\n'):
  191.                 print indent + '  ' + line
  192.             
  193.         
  194.  
  195.     
  196.     def find_config_files(self):
  197.         """Find as many configuration files as should be processed for this
  198.         platform, and return a list of filenames in the order in which they
  199.         should be parsed.  The filenames returned are guaranteed to exist
  200.         (modulo nasty race conditions).
  201.  
  202.         There are three possible config files: distutils.cfg in the
  203.         Distutils installation directory (ie. where the top-level
  204.         Distutils __inst__.py file lives), a file in the user's home
  205.         directory named .pydistutils.cfg on Unix and pydistutils.cfg
  206.         on Windows/Mac, and setup.cfg in the current directory.
  207.         """
  208.         files = []
  209.         check_environ()
  210.         sys_dir = os.path.dirname(sys.modules['distutils'].__file__)
  211.         sys_file = os.path.join(sys_dir, 'distutils.cfg')
  212.         if os.path.isfile(sys_file):
  213.             files.append(sys_file)
  214.         
  215.         if os.name == 'posix':
  216.             user_filename = '.pydistutils.cfg'
  217.         else:
  218.             user_filename = 'pydistutils.cfg'
  219.         if os.environ.has_key('HOME'):
  220.             user_file = os.path.join(os.environ.get('HOME'), user_filename)
  221.             if os.path.isfile(user_file):
  222.                 files.append(user_file)
  223.             
  224.         
  225.         local_file = 'setup.cfg'
  226.         if os.path.isfile(local_file):
  227.             files.append(local_file)
  228.         
  229.         return files
  230.  
  231.     
  232.     def parse_config_files(self, filenames = None):
  233.         ConfigParser = ConfigParser
  234.         import ConfigParser
  235.         if filenames is None:
  236.             filenames = self.find_config_files()
  237.         
  238.         if DEBUG:
  239.             print 'Distribution.parse_config_files():'
  240.         
  241.         parser = ConfigParser()
  242.         for filename in filenames:
  243.             if DEBUG:
  244.                 print '  reading', filename
  245.             
  246.             parser.read(filename)
  247.             for section in parser.sections():
  248.                 options = parser.options(section)
  249.                 opt_dict = self.get_option_dict(section)
  250.                 for opt in options:
  251.                     if opt != '__name__':
  252.                         val = parser.get(section, opt)
  253.                         opt = string.replace(opt, '-', '_')
  254.                         opt_dict[opt] = (filename, val)
  255.                         continue
  256.                 
  257.             
  258.             parser.__init__()
  259.         
  260.  
  261.     
  262.     def parse_command_line(self):
  263.         '''Parse the setup script\'s command line, taken from the
  264.         \'script_args\' instance attribute (which defaults to \'sys.argv[1:]\'
  265.         -- see \'setup()\' in core.py).  This list is first processed for
  266.         "global options" -- options that set attributes of the Distribution
  267.         instance.  Then, it is alternately scanned for Distutils commands
  268.         and options for that command.  Each new command terminates the
  269.         options for the previous command.  The allowed options for a
  270.         command are determined by the \'user_options\' attribute of the
  271.         command class -- thus, we have to be able to load command classes
  272.         in order to parse the command line.  Any error in that \'options\'
  273.         attribute raises DistutilsGetoptError; any error on the
  274.         command-line raises DistutilsArgError.  If no Distutils commands
  275.         were found on the command line, raises DistutilsArgError.  Return
  276.         true if command-line was successfully parsed and we should carry
  277.         on with executing commands; false if no errors but we shouldn\'t
  278.         execute commands (currently, this only happens if user asks for
  279.         help).
  280.         '''
  281.         toplevel_options = self._get_toplevel_options()
  282.         if sys.platform == 'mac':
  283.             import EasyDialogs as EasyDialogs
  284.             cmdlist = self.get_command_list()
  285.             self.script_args = EasyDialogs.GetArgv(toplevel_options + self.display_options, cmdlist)
  286.         
  287.         self.commands = []
  288.         parser = FancyGetopt(toplevel_options + self.display_options)
  289.         parser.set_negative_aliases(self.negative_opt)
  290.         parser.set_aliases({
  291.             'licence': 'license' })
  292.         args = parser.getopt(args = self.script_args, object = self)
  293.         option_order = parser.get_option_order()
  294.         log.set_verbosity(self.verbose)
  295.         if self.handle_display_options(option_order):
  296.             return None
  297.         
  298.         while args:
  299.             args = self._parse_command_opts(parser, args)
  300.             if args is None:
  301.                 return None
  302.                 continue
  303.         if self.help:
  304.             self._show_help(parser, display_options = len(self.commands) == 0, commands = self.commands)
  305.             return None
  306.         
  307.         if not self.commands:
  308.             raise DistutilsArgError, 'no commands supplied'
  309.         
  310.         return 1
  311.  
  312.     
  313.     def _get_toplevel_options(self):
  314.         '''Return the non-display options recognized at the top level.
  315.  
  316.         This includes options that are recognized *only* at the top
  317.         level as well as options recognized for commands.
  318.         '''
  319.         return self.global_options + [
  320.             ('command-packages=', None, 'list of packages that provide distutils commands')]
  321.  
  322.     
  323.     def _parse_command_opts(self, parser, args):
  324.         """Parse the command-line options for a single command.
  325.         'parser' must be a FancyGetopt instance; 'args' must be the list
  326.         of arguments, starting with the current command (whose options
  327.         we are about to parse).  Returns a new version of 'args' with
  328.         the next command at the front of the list; will be the empty
  329.         list if there are no more commands on the command line.  Returns
  330.         None if the user asked for help on this command.
  331.         """
  332.         Command = Command
  333.         import distutils.cmd
  334.         command = args[0]
  335.         if not command_re.match(command):
  336.             raise SystemExit, "invalid command name '%s'" % command
  337.         
  338.         self.commands.append(command)
  339.         
  340.         try:
  341.             cmd_class = self.get_command_class(command)
  342.         except DistutilsModuleError:
  343.             msg = None
  344.             raise DistutilsArgError, msg
  345.  
  346.         if not issubclass(cmd_class, Command):
  347.             raise DistutilsClassError, 'command class %s must subclass Command' % cmd_class
  348.         
  349.         if not hasattr(cmd_class, 'user_options') and type(cmd_class.user_options) is ListType:
  350.             raise DistutilsClassError, ('command class %s must provide ' + "'user_options' attribute (a list of tuples)") % cmd_class
  351.         
  352.         negative_opt = self.negative_opt
  353.         if hasattr(cmd_class, 'negative_opt'):
  354.             negative_opt = copy(negative_opt)
  355.             negative_opt.update(cmd_class.negative_opt)
  356.         
  357.         if hasattr(cmd_class, 'help_options') and type(cmd_class.help_options) is ListType:
  358.             help_options = fix_help_options(cmd_class.help_options)
  359.         else:
  360.             help_options = []
  361.         parser.set_option_table(self.global_options + cmd_class.user_options + help_options)
  362.         parser.set_negative_aliases(negative_opt)
  363.         (args, opts) = parser.getopt(args[1:])
  364.         if hasattr(opts, 'help') and opts.help:
  365.             self._show_help(parser, display_options = 0, commands = [
  366.                 cmd_class])
  367.             return None
  368.         
  369.         if hasattr(cmd_class, 'help_options') and type(cmd_class.help_options) is ListType:
  370.             help_option_found = 0
  371.             for help_option, short, desc, func in cmd_class.help_options:
  372.                 if hasattr(opts, parser.get_attr_name(help_option)):
  373.                     help_option_found = 1
  374.                     if callable(func):
  375.                         func()
  376.                     else:
  377.                         raise DistutilsClassError("invalid help function %r for help option '%s': must be a callable object (function, etc.)" % (func, help_option))
  378.                 callable(func)
  379.             
  380.             if help_option_found:
  381.                 return None
  382.             
  383.         
  384.         opt_dict = self.get_option_dict(command)
  385.         for name, value in vars(opts).items():
  386.             opt_dict[name] = ('command line', value)
  387.         
  388.         return args
  389.  
  390.     
  391.     def finalize_options(self):
  392.         '''Set final values for all the options on the Distribution
  393.         instance, analogous to the .finalize_options() method of Command
  394.         objects.
  395.         '''
  396.         keywords = self.metadata.keywords
  397.         if keywords is not None:
  398.             if type(keywords) is StringType:
  399.                 keywordlist = string.split(keywords, ',')
  400.                 self.metadata.keywords = map(string.strip, keywordlist)
  401.             
  402.         
  403.         platforms = self.metadata.platforms
  404.         if platforms is not None:
  405.             if type(platforms) is StringType:
  406.                 platformlist = string.split(platforms, ',')
  407.                 self.metadata.platforms = map(string.strip, platformlist)
  408.             
  409.         
  410.  
  411.     
  412.     def _show_help(self, parser, global_options = 1, display_options = 1, commands = []):
  413.         '''Show help for the setup script command-line in the form of
  414.         several lists of command-line options.  \'parser\' should be a
  415.         FancyGetopt instance; do not expect it to be returned in the
  416.         same state, as its option table will be reset to make it
  417.         generate the correct help text.
  418.  
  419.         If \'global_options\' is true, lists the global options:
  420.         --verbose, --dry-run, etc.  If \'display_options\' is true, lists
  421.         the "display-only" options: --name, --version, etc.  Finally,
  422.         lists per-command help for every command name or command class
  423.         in \'commands\'.
  424.         '''
  425.         gen_usage = gen_usage
  426.         import distutils.core
  427.         Command = Command
  428.         import distutils.cmd
  429.         if global_options:
  430.             if display_options:
  431.                 options = self._get_toplevel_options()
  432.             else:
  433.                 options = self.global_options
  434.             parser.set_option_table(options)
  435.             parser.print_help(self.common_usage + '\nGlobal options:')
  436.             print 
  437.         
  438.         if display_options:
  439.             parser.set_option_table(self.display_options)
  440.             parser.print_help('Information display options (just display ' + 'information, ignore any commands)')
  441.             print 
  442.         
  443.         for command in self.commands:
  444.             if type(command) is ClassType and issubclass(command, Command):
  445.                 klass = command
  446.             else:
  447.                 klass = self.get_command_class(command)
  448.             if hasattr(klass, 'help_options') and type(klass.help_options) is ListType:
  449.                 parser.set_option_table(klass.user_options + fix_help_options(klass.help_options))
  450.             else:
  451.                 parser.set_option_table(klass.user_options)
  452.             parser.print_help("Options for '%s' command:" % klass.__name__)
  453.             print 
  454.         
  455.         print gen_usage(self.script_name)
  456.  
  457.     
  458.     def handle_display_options(self, option_order):
  459.         '''If there were any non-global "display-only" options
  460.         (--help-commands or the metadata display options) on the command
  461.         line, display the requested info and return true; else return
  462.         false.
  463.         '''
  464.         gen_usage = gen_usage
  465.         import distutils.core
  466.         if self.help_commands:
  467.             self.print_commands()
  468.             print 
  469.             print gen_usage(self.script_name)
  470.             return 1
  471.         
  472.         any_display_options = 0
  473.         is_display_option = { }
  474.         for option in self.display_options:
  475.             is_display_option[option[0]] = 1
  476.         
  477.         for opt, val in option_order:
  478.             if val and is_display_option.get(opt):
  479.                 opt = translate_longopt(opt)
  480.                 value = getattr(self.metadata, 'get_' + opt)()
  481.                 if opt in ('keywords', 'platforms'):
  482.                     print string.join(value, ',')
  483.                 elif opt in ('classifiers', 'provides', 'requires', 'obsoletes'):
  484.                     print string.join(value, '\n')
  485.                 else:
  486.                     print value
  487.                 any_display_options = 1
  488.                 continue
  489.         
  490.         return any_display_options
  491.  
  492.     
  493.     def print_command_list(self, commands, header, max_length):
  494.         """Print a subset of the list of all commands -- used by
  495.         'print_commands()'.
  496.         """
  497.         print header + ':'
  498.         for cmd in commands:
  499.             klass = self.cmdclass.get(cmd)
  500.             if not klass:
  501.                 klass = self.get_command_class(cmd)
  502.             
  503.             
  504.             try:
  505.                 description = klass.description
  506.             except AttributeError:
  507.                 description = '(no description available)'
  508.  
  509.             print '  %-*s  %s' % (max_length, cmd, description)
  510.         
  511.  
  512.     
  513.     def print_commands(self):
  514.         '''Print out a help message listing all available commands with a
  515.         description of each.  The list is divided into "standard commands"
  516.         (listed in distutils.command.__all__) and "extra commands"
  517.         (mentioned in self.cmdclass, but not a standard command).  The
  518.         descriptions come from the command class attribute
  519.         \'description\'.
  520.         '''
  521.         import distutils.command as distutils
  522.         std_commands = distutils.command.__all__
  523.         is_std = { }
  524.         for cmd in std_commands:
  525.             is_std[cmd] = 1
  526.         
  527.         extra_commands = []
  528.         for cmd in self.cmdclass.keys():
  529.             if not is_std.get(cmd):
  530.                 extra_commands.append(cmd)
  531.                 continue
  532.         
  533.         max_length = 0
  534.         for cmd in std_commands + extra_commands:
  535.             if len(cmd) > max_length:
  536.                 max_length = len(cmd)
  537.                 continue
  538.         
  539.         self.print_command_list(std_commands, 'Standard commands', max_length)
  540.         if extra_commands:
  541.             print 
  542.             self.print_command_list(extra_commands, 'Extra commands', max_length)
  543.         
  544.  
  545.     
  546.     def get_command_list(self):
  547.         '''Get a list of (command, description) tuples.
  548.         The list is divided into "standard commands" (listed in
  549.         distutils.command.__all__) and "extra commands" (mentioned in
  550.         self.cmdclass, but not a standard command).  The descriptions come
  551.         from the command class attribute \'description\'.
  552.         '''
  553.         import distutils.command as distutils
  554.         std_commands = distutils.command.__all__
  555.         is_std = { }
  556.         for cmd in std_commands:
  557.             is_std[cmd] = 1
  558.         
  559.         extra_commands = []
  560.         for cmd in self.cmdclass.keys():
  561.             if not is_std.get(cmd):
  562.                 extra_commands.append(cmd)
  563.                 continue
  564.         
  565.         rv = []
  566.         for cmd in std_commands + extra_commands:
  567.             klass = self.cmdclass.get(cmd)
  568.             if not klass:
  569.                 klass = self.get_command_class(cmd)
  570.             
  571.             
  572.             try:
  573.                 description = klass.description
  574.             except AttributeError:
  575.                 description = '(no description available)'
  576.  
  577.             rv.append((cmd, description))
  578.         
  579.         return rv
  580.  
  581.     
  582.     def get_command_packages(self):
  583.         '''Return a list of packages from which commands are loaded.'''
  584.         pkgs = self.command_packages
  585.         if not isinstance(pkgs, type([])):
  586.             if not pkgs:
  587.                 pass
  588.             pkgs = string.split('', ',')
  589.             for i in range(len(pkgs)):
  590.                 pkgs[i] = string.strip(pkgs[i])
  591.             
  592.             pkgs = filter(None, pkgs)
  593.             if 'distutils.command' not in pkgs:
  594.                 pkgs.insert(0, 'distutils.command')
  595.             
  596.             self.command_packages = pkgs
  597.         
  598.         return pkgs
  599.  
  600.     
  601.     def get_command_class(self, command):
  602.         '''Return the class that implements the Distutils command named by
  603.         \'command\'.  First we check the \'cmdclass\' dictionary; if the
  604.         command is mentioned there, we fetch the class object from the
  605.         dictionary and return it.  Otherwise we load the command module
  606.         ("distutils.command." + command) and fetch the command class from
  607.         the module.  The loaded class is also stored in \'cmdclass\'
  608.         to speed future calls to \'get_command_class()\'.
  609.  
  610.         Raises DistutilsModuleError if the expected module could not be
  611.         found, or if that module does not define the expected class.
  612.         '''
  613.         klass = self.cmdclass.get(command)
  614.         if klass:
  615.             return klass
  616.         
  617.         for pkgname in self.get_command_packages():
  618.             module_name = '%s.%s' % (pkgname, command)
  619.             klass_name = command
  620.             
  621.             try:
  622.                 __import__(module_name)
  623.                 module = sys.modules[module_name]
  624.             except ImportError:
  625.                 continue
  626.  
  627.             
  628.             try:
  629.                 klass = getattr(module, klass_name)
  630.             except AttributeError:
  631.                 raise DistutilsModuleError, "invalid command '%s' (no class '%s' in module '%s')" % (command, klass_name, module_name)
  632.  
  633.             self.cmdclass[command] = klass
  634.             return klass
  635.         
  636.         raise DistutilsModuleError("invalid command '%s'" % command)
  637.  
  638.     
  639.     def get_command_obj(self, command, create = 1):
  640.         """Return the command object for 'command'.  Normally this object
  641.         is cached on a previous call to 'get_command_obj()'; if no command
  642.         object for 'command' is in the cache, then we either create and
  643.         return it (if 'create' is true) or return None.
  644.         """
  645.         cmd_obj = self.command_obj.get(command)
  646.         if not cmd_obj and create:
  647.             if DEBUG:
  648.                 print "Distribution.get_command_obj(): creating '%s' command object" % command
  649.             
  650.             klass = self.get_command_class(command)
  651.             cmd_obj = self.command_obj[command] = klass(self)
  652.             self.have_run[command] = 0
  653.             options = self.command_options.get(command)
  654.             if options:
  655.                 self._set_command_options(cmd_obj, options)
  656.             
  657.         
  658.         return cmd_obj
  659.  
  660.     
  661.     def _set_command_options(self, command_obj, option_dict = None):
  662.         """Set the options for 'command_obj' from 'option_dict'.  Basically
  663.         this means copying elements of a dictionary ('option_dict') to
  664.         attributes of an instance ('command').
  665.  
  666.         'command_obj' must be a Command instance.  If 'option_dict' is not
  667.         supplied, uses the standard option dictionary for this command
  668.         (from 'self.command_options').
  669.         """
  670.         command_name = command_obj.get_command_name()
  671.         if option_dict is None:
  672.             option_dict = self.get_option_dict(command_name)
  673.         
  674.         if DEBUG:
  675.             print "  setting options for '%s' command:" % command_name
  676.         
  677.         for source, value in option_dict.items():
  678.             
  679.             try:
  680.                 bool_opts = map(translate_longopt, command_obj.boolean_options)
  681.             except AttributeError:
  682.                 None if DEBUG else None
  683.                 None if DEBUG else None
  684.                 bool_opts = []
  685.             except:
  686.                 None if DEBUG else None
  687.  
  688.             
  689.             try:
  690.                 neg_opt = command_obj.negative_opt
  691.             except AttributeError:
  692.                 None if DEBUG else None
  693.                 None if DEBUG else None
  694.                 neg_opt = { }
  695.             except:
  696.                 None if DEBUG else None
  697.  
  698.             
  699.             try:
  700.                 is_string = type(value) is StringType
  701.                 if neg_opt.has_key(option) and is_string:
  702.                     setattr(command_obj, neg_opt[option], not strtobool(value))
  703.                 elif option in bool_opts and is_string:
  704.                     setattr(command_obj, option, strtobool(value))
  705.                 elif hasattr(command_obj, option):
  706.                     setattr(command_obj, option, value)
  707.                 else:
  708.                     raise DistutilsOptionError, "error in %s: command '%s' has no such option '%s'" % (source, command_name, option)
  709.             continue
  710.             except ValueError:
  711.                 None if DEBUG else None
  712.                 msg = None if DEBUG else None
  713.                 raise DistutilsOptionError, msg
  714.                 continue
  715.             
  716.  
  717.         
  718.  
  719.     
  720.     def reinitialize_command(self, command, reinit_subcommands = 0):
  721.         '''Reinitializes a command to the state it was in when first
  722.         returned by \'get_command_obj()\': ie., initialized but not yet
  723.         finalized.  This provides the opportunity to sneak option
  724.         values in programmatically, overriding or supplementing
  725.         user-supplied values from the config files and command line.
  726.         You\'ll have to re-finalize the command object (by calling
  727.         \'finalize_options()\' or \'ensure_finalized()\') before using it for
  728.         real.
  729.  
  730.         \'command\' should be a command name (string) or command object.  If
  731.         \'reinit_subcommands\' is true, also reinitializes the command\'s
  732.         sub-commands, as declared by the \'sub_commands\' class attribute (if
  733.         it has one).  See the "install" command for an example.  Only
  734.         reinitializes the sub-commands that actually matter, ie. those
  735.         whose test predicates return true.
  736.  
  737.         Returns the reinitialized command object.
  738.         '''
  739.         Command = Command
  740.         import distutils.cmd
  741.         if not isinstance(command, Command):
  742.             command_name = command
  743.             command = self.get_command_obj(command_name)
  744.         else:
  745.             command_name = command.get_command_name()
  746.         if not command.finalized:
  747.             return command
  748.         
  749.         command.initialize_options()
  750.         command.finalized = 0
  751.         self.have_run[command_name] = 0
  752.         self._set_command_options(command)
  753.         if reinit_subcommands:
  754.             for sub in command.get_sub_commands():
  755.                 self.reinitialize_command(sub, reinit_subcommands)
  756.             
  757.         
  758.         return command
  759.  
  760.     
  761.     def announce(self, msg, level = 1):
  762.         log.debug(msg)
  763.  
  764.     
  765.     def run_commands(self):
  766.         """Run each command that was seen on the setup script command line.
  767.         Uses the list of commands found and cache of command objects
  768.         created by 'get_command_obj()'.
  769.         """
  770.         for cmd in self.commands:
  771.             self.run_command(cmd)
  772.         
  773.  
  774.     
  775.     def run_command(self, command):
  776.         """Do whatever it takes to run a command (including nothing at all,
  777.         if the command has already been run).  Specifically: if we have
  778.         already created and run the command named by 'command', return
  779.         silently without doing anything.  If the command named by 'command'
  780.         doesn't even have a command object yet, create one.  Then invoke
  781.         'run()' on that command object (or an existing one).
  782.         """
  783.         if self.have_run.get(command):
  784.             return None
  785.         
  786.         log.info('running %s', command)
  787.         cmd_obj = self.get_command_obj(command)
  788.         cmd_obj.ensure_finalized()
  789.         cmd_obj.run()
  790.         self.have_run[command] = 1
  791.  
  792.     
  793.     def has_pure_modules(self):
  794.         if not self.packages and self.py_modules:
  795.             pass
  796.         return len([]) > 0
  797.  
  798.     
  799.     def has_ext_modules(self):
  800.         if self.ext_modules:
  801.             pass
  802.         return len(self.ext_modules) > 0
  803.  
  804.     
  805.     def has_c_libraries(self):
  806.         if self.libraries:
  807.             pass
  808.         return len(self.libraries) > 0
  809.  
  810.     
  811.     def has_modules(self):
  812.         if not self.has_pure_modules():
  813.             pass
  814.         return self.has_ext_modules()
  815.  
  816.     
  817.     def has_headers(self):
  818.         if self.headers:
  819.             pass
  820.         return len(self.headers) > 0
  821.  
  822.     
  823.     def has_scripts(self):
  824.         if self.scripts:
  825.             pass
  826.         return len(self.scripts) > 0
  827.  
  828.     
  829.     def has_data_files(self):
  830.         if self.data_files:
  831.             pass
  832.         return len(self.data_files) > 0
  833.  
  834.     
  835.     def is_pure(self):
  836.         if self.has_pure_modules() and not self.has_ext_modules():
  837.             pass
  838.         return not self.has_c_libraries()
  839.  
  840.  
  841.  
  842. class DistributionMetadata:
  843.     '''Dummy class to hold the distribution meta-data: name, version,
  844.     author, and so forth.
  845.     '''
  846.     _METHOD_BASENAMES = ('name', 'version', 'author', 'author_email', 'maintainer', 'maintainer_email', 'url', 'license', 'description', 'long_description', 'keywords', 'platforms', 'fullname', 'contact', 'contact_email', 'license', 'classifiers', 'download_url', 'provides', 'requires', 'obsoletes')
  847.     
  848.     def __init__(self):
  849.         self.name = None
  850.         self.version = None
  851.         self.author = None
  852.         self.author_email = None
  853.         self.maintainer = None
  854.         self.maintainer_email = None
  855.         self.url = None
  856.         self.license = None
  857.         self.description = None
  858.         self.long_description = None
  859.         self.keywords = None
  860.         self.platforms = None
  861.         self.classifiers = None
  862.         self.download_url = None
  863.         self.provides = None
  864.         self.requires = None
  865.         self.obsoletes = None
  866.  
  867.     
  868.     def write_pkg_info(self, base_dir):
  869.         '''Write the PKG-INFO file into the release tree.
  870.         '''
  871.         pkg_info = open(os.path.join(base_dir, 'PKG-INFO'), 'w')
  872.         self.write_pkg_file(pkg_info)
  873.         pkg_info.close()
  874.  
  875.     
  876.     def write_pkg_file(self, file):
  877.         '''Write the PKG-INFO format data to a file object.
  878.         '''
  879.         version = '1.0'
  880.         if self.provides and self.requires or self.obsoletes:
  881.             version = '1.1'
  882.         
  883.         file.write('Metadata-Version: %s\n' % version)
  884.         file.write('Name: %s\n' % self.get_name())
  885.         file.write('Version: %s\n' % self.get_version())
  886.         file.write('Summary: %s\n' % self.get_description())
  887.         file.write('Home-page: %s\n' % self.get_url())
  888.         file.write('Author: %s\n' % self.get_contact())
  889.         file.write('Author-email: %s\n' % self.get_contact_email())
  890.         file.write('License: %s\n' % self.get_license())
  891.         if self.download_url:
  892.             file.write('Download-URL: %s\n' % self.download_url)
  893.         
  894.         long_desc = rfc822_escape(self.get_long_description())
  895.         file.write('Description: %s\n' % long_desc)
  896.         keywords = string.join(self.get_keywords(), ',')
  897.         if keywords:
  898.             file.write('Keywords: %s\n' % keywords)
  899.         
  900.         self._write_list(file, 'Platform', self.get_platforms())
  901.         self._write_list(file, 'Classifier', self.get_classifiers())
  902.         self._write_list(file, 'Requires', self.get_requires())
  903.         self._write_list(file, 'Provides', self.get_provides())
  904.         self._write_list(file, 'Obsoletes', self.get_obsoletes())
  905.  
  906.     
  907.     def _write_list(self, file, name, values):
  908.         for value in values:
  909.             file.write('%s: %s\n' % (name, value))
  910.         
  911.  
  912.     
  913.     def get_name(self):
  914.         if not self.name:
  915.             pass
  916.         return 'UNKNOWN'
  917.  
  918.     
  919.     def get_version(self):
  920.         if not self.version:
  921.             pass
  922.         return '0.0.0'
  923.  
  924.     
  925.     def get_fullname(self):
  926.         return '%s-%s' % (self.get_name(), self.get_version())
  927.  
  928.     
  929.     def get_author(self):
  930.         if not self.author:
  931.             pass
  932.         return 'UNKNOWN'
  933.  
  934.     
  935.     def get_author_email(self):
  936.         if not self.author_email:
  937.             pass
  938.         return 'UNKNOWN'
  939.  
  940.     
  941.     def get_maintainer(self):
  942.         if not self.maintainer:
  943.             pass
  944.         return 'UNKNOWN'
  945.  
  946.     
  947.     def get_maintainer_email(self):
  948.         if not self.maintainer_email:
  949.             pass
  950.         return 'UNKNOWN'
  951.  
  952.     
  953.     def get_contact(self):
  954.         if not self.maintainer and self.author:
  955.             pass
  956.         return 'UNKNOWN'
  957.  
  958.     
  959.     def get_contact_email(self):
  960.         if not self.maintainer_email and self.author_email:
  961.             pass
  962.         return 'UNKNOWN'
  963.  
  964.     
  965.     def get_url(self):
  966.         if not self.url:
  967.             pass
  968.         return 'UNKNOWN'
  969.  
  970.     
  971.     def get_license(self):
  972.         if not self.license:
  973.             pass
  974.         return 'UNKNOWN'
  975.  
  976.     get_licence = get_license
  977.     
  978.     def get_description(self):
  979.         if not self.description:
  980.             pass
  981.         return 'UNKNOWN'
  982.  
  983.     
  984.     def get_long_description(self):
  985.         if not self.long_description:
  986.             pass
  987.         return 'UNKNOWN'
  988.  
  989.     
  990.     def get_keywords(self):
  991.         if not self.keywords:
  992.             pass
  993.         return []
  994.  
  995.     
  996.     def get_platforms(self):
  997.         if not self.platforms:
  998.             pass
  999.         return [
  1000.             'UNKNOWN']
  1001.  
  1002.     
  1003.     def get_classifiers(self):
  1004.         if not self.classifiers:
  1005.             pass
  1006.         return []
  1007.  
  1008.     
  1009.     def get_download_url(self):
  1010.         if not self.download_url:
  1011.             pass
  1012.         return 'UNKNOWN'
  1013.  
  1014.     
  1015.     def get_requires(self):
  1016.         if not self.requires:
  1017.             pass
  1018.         return []
  1019.  
  1020.     
  1021.     def set_requires(self, value):
  1022.         import distutils.versionpredicate as distutils
  1023.         for v in value:
  1024.             distutils.versionpredicate.VersionPredicate(v)
  1025.         
  1026.         self.requires = value
  1027.  
  1028.     
  1029.     def get_provides(self):
  1030.         if not self.provides:
  1031.             pass
  1032.         return []
  1033.  
  1034.     
  1035.     def set_provides(self, value):
  1036.         value = [ v.strip() for v in value ]
  1037.         for v in value:
  1038.             import distutils.versionpredicate as distutils
  1039.             distutils.versionpredicate.split_provision(v)
  1040.         
  1041.         self.provides = value
  1042.  
  1043.     
  1044.     def get_obsoletes(self):
  1045.         if not self.obsoletes:
  1046.             pass
  1047.         return []
  1048.  
  1049.     
  1050.     def set_obsoletes(self, value):
  1051.         import distutils.versionpredicate as distutils
  1052.         for v in value:
  1053.             distutils.versionpredicate.VersionPredicate(v)
  1054.         
  1055.         self.obsoletes = value
  1056.  
  1057.  
  1058.  
  1059. def fix_help_options(options):
  1060.     """Convert a 4-tuple 'help_options' list as found in various command
  1061.     classes to the 3-tuple form required by FancyGetopt.
  1062.     """
  1063.     new_options = []
  1064.     for help_tuple in options:
  1065.         new_options.append(help_tuple[0:3])
  1066.     
  1067.     return new_options
  1068.  
  1069. if __name__ == '__main__':
  1070.     dist = Distribution()
  1071.     print 'ok'
  1072.  
  1073.